package com.dragon.refect.classload;

/**
 * 被动引用的演示案例一：
 * 通过子类引用父类的静态字段，不会导致子类初始化
 * -XX:+TraceCLassLoading, 用于追踪类的加载信息并打印出来
 *
 * -XX:+<option>, 表示开启option选项
 * -XX:-<option>, 表示关闭option选项
 * -XX:<option>=<value>,表示将option选项的值设置为value
 *
 * @author dragon
 * @since 2019/11/13
 */
public class PassiveReferenceDemo1 {

    public static void main(String[] args) {
        /*
         * 上述代码运行后，只会输出 SuperClass init!, 不会输出 SubClass init!。
         * 对于静态字段，只有直接定义了这个字段的类才会被初始化，因此通过其子类来引用父类中定义的静态字段，只会触发父类的初始化而不会触发其子类的初始化
         * 至于是否要触发子类的加载和验证，在虚拟机规范中并没有明确规定，这点取决于虚拟机的具体实现
         */
        System.out.println(SubClass.value);
    }
}

class SuperClass {
    static {
        System.out.println("SuperClass init!");
    }

    public static int value = 10;
}

class SubClass extends SuperClass {
    static {
        System.out.println("SubClass init!");
    }
}

